// #include "../../../common/data_redis.hpp"
// #include <gflags/gflags.h>
// #include <thread>

// DEFINE_bool(run_mode, false, "程序的运行模式，false-调试； true-发布；");
// DEFINE_string(log_file, "", "发布模式下，用于指定日志的输出文件");
// DEFINE_int32(log_level, 0, "发布模式下，用于指定日志输出等级");


// DEFINE_string(ip, "127.0.0.1", "这是服务器的IP地址，格式：127.0.0.1");
// DEFINE_int32(port, 6379, "这是服务器的端口, 格式: 8080");
// DEFINE_int32(db, 0, "库的编号：默认0号");
// DEFINE_bool(keep_alive, true, "是否进行长连接保活");

// void session_test(const std::shared_ptr<sw::redis::Redis> &client)
// {
//     mag::Session ss(client);
//     ss.append("会话ID1", "用户ID1");
//     ss.append("会话ID2", "用户ID2");
//     ss.append("会话ID3", "用户ID3");
//     ss.append("会话ID4", "用户ID4");

//     ss.remove("会话ID2");
//     ss.remove("会话ID3");

//     auto res1 = ss.uid("会话ID1");
//     if (res1) std::cout << *res1 << std::endl;
//     auto res2 = ss.uid("会话ID2");
//     if (res2) std::cout << *res2 << std::endl;
//     auto res3 = ss.uid("会话ID3");
//     if (res3) std::cout << *res3 << std::endl;
//     auto res4 = ss.uid("会话ID4");
//     if (res4) std::cout << *res4 << std::endl;
// }

// void status_test(const std::shared_ptr<sw::redis::Redis> &client) {
//     mag::Status status(client);
//     status.append("用户ID1");
//     status.append("用户ID2");
//     status.append("用户ID3");
    
//     status.remove("用户ID2");

//     if (status.exists("用户ID1")) std::cout << "用户1在线！" << std::endl;
//     if (status.exists("用户ID2")) std::cout << "用户2在线！" << std::endl;
//     if (status.exists("用户ID3")) std::cout << "用户3在线！" << std::endl;
// }

// void code_test(const std::shared_ptr<sw::redis::Redis> &client) {
//     mag::Codes codes(client);
//     codes.append("验证码ID1", "验证码1");
//     codes.append("验证码ID2", "验证码2");
//     codes.append("验证码ID3", "验证码3");
    
//     codes.remove("验证码ID2");

//     auto y1 = codes.code("验证码ID1");
//     auto y2 = codes.code("验证码ID2");
//     auto y3 = codes.code("验证码ID3");
//     if (y1) std::cout << *y1 << std::endl;
//     if (y2) std::cout << *y2 << std::endl;
//     if (y3) std::cout << *y3 << std::endl;

//     std::this_thread::sleep_for(std::chrono::seconds(4));
//     auto y4 = codes.code("验证码ID1");
//     auto y5 = codes.code("验证码ID2");
//     auto y6 = codes.code("验证码ID3");
//     if (!y4) std::cout << "验证码ID1不存在" << std::endl;
//     if (!y5) std::cout << "验证码ID2不存在" << std::endl;
//     if (!y6) std::cout << "验证码ID3不存在" << std::endl;
// }



// int main(int argc , char *argv[])
// {
//     google::ParseCommandLineFlags(&argc, &argv, true);
//     auto client = mag::RedisClientFactory::create(FLAGS_ip, FLAGS_port, FLAGS_db, FLAGS_keep_alive);

//     // session_test(client);
//     // status_test(client);
//     code_test(client);
    

//     return 0;
// }


/////////////////////////////////////////////
///gtest测试框架
////////////////////////////////////////////


#include <gtest/gtest.h>
#include <sw/redis++/redis.h>
#include "../../../common/data_redis.hpp"
#include <thread>

// 传入 Redis 客户端实例
class RedisTest : public ::testing::Test {
protected:
    std::shared_ptr<sw::redis::Redis> client;

    // 在每个测试用例前执行的代码
    void SetUp() override {
        // 配置 Redis 客户端
        client = mag::RedisClientFactory::create("127.0.0.1", 6379, 0, true);
    }

    // 在每个测试用例后执行的代码
    void TearDown() override {
        // 清理 Redis 数据库，以确保测试环境一致
        client->flushall();
    }
};

// Session 测试用例
TEST_F(RedisTest, SessionTest) {
    mag::Session ss(client);

    // 测试添加会话信息
    ss.append("会话ID1", "用户ID1");
    ss.append("会话ID2", "用户ID2");
    ss.append("会话ID3", "用户ID3");
    ss.append("会话ID4", "用户ID4");

    // 测试删除会话信息
    ss.remove("会话ID2");
    ss.remove("会话ID3");

    // 测试获取会话信息
    auto res1 = ss.uid("会话ID1");
    EXPECT_TRUE(res1.has_value());
    EXPECT_EQ(*res1, "用户ID1");

    auto res2 = ss.uid("会话ID2");
    EXPECT_FALSE(res2.has_value());

    auto res3 = ss.uid("会话ID3");
    EXPECT_FALSE(res3.has_value());

    auto res4 = ss.uid("会话ID4");
    EXPECT_TRUE(res4.has_value());
    EXPECT_EQ(*res4, "用户ID4");
}

// Status 测试用例
TEST_F(RedisTest, StatusTest) {
    mag::Status status(client);

    // 测试添加在线状态
    status.append("用户ID1");
    status.append("用户ID2");
    status.append("用户ID3");

    // 测试删除在线状态
    status.remove("用户ID2");

    // 测试用户是否在线
    EXPECT_TRUE(status.exists("用户ID1"));
    EXPECT_FALSE(status.exists("用户ID2"));
    EXPECT_TRUE(status.exists("用户ID3"));
}

// Codes 测试用例
TEST_F(RedisTest, CodesTest) {
    mag::Codes codes(client);

    // 设置验证码并设置较短的过期时间
    codes.append("验证码ID1", "验证码1", std::chrono::milliseconds(5000));  // 5秒过期
    codes.append("验证码ID2", "验证码2", std::chrono::milliseconds(5000));
    codes.append("验证码ID3", "验证码3", std::chrono::milliseconds(5000));

    // 删除验证码ID2
    codes.remove("验证码ID2");

    // 检查验证码是否存在
    auto y1 = codes.code("验证码ID1");
    EXPECT_TRUE(y1.has_value());
    EXPECT_EQ(*y1, "验证码1");

    auto y2 = codes.code("验证码ID2");
    EXPECT_FALSE(y2.has_value());

    auto y3 = codes.code("验证码ID3");
    EXPECT_TRUE(y3.has_value());
    EXPECT_EQ(*y3, "验证码3");

    // 等待验证码过期
    std::this_thread::sleep_for(std::chrono::seconds(6));  // 等待验证码过期

    // 检查验证码是否过期
    auto y4 = codes.code("验证码ID1");
    EXPECT_FALSE(y4.has_value());

    auto y5 = codes.code("验证码ID2");
    EXPECT_FALSE(y5.has_value());

    auto y6 = codes.code("验证码ID3");
    EXPECT_FALSE(y6.has_value());
}


// main 函数，只用于运行测试
int main(int argc, char *argv[]) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
